/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.japo.java.basic.samples;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

/**
 *
 * @author Pablo Parra
 */

// EVENTOS DE VENTANA SON DE BAJO NIVEL, HEREDAN DE LA CLASE ADAPTADORA
// CORRESPONDIENTE PARA EVITAR TENER QUE IMPLEMENTAR TODOS LOS MÉTODOS
// DEL INTERFAZ QUE NO VAMOS A UTILIZAR.
class GEV extends WindowAdapter{
    // El fichero que nos va a servir para comprobar si la app ya está
    // en ejecución es "instancia.lock":
    
//    Cuando la app se lanza va al sitio dado y comprueba si ya existe la
//    instancia (el fichero). Si no existe, la app se ejecuta y crea la instancia.
//    Si vuelve a lanzarse la app por segunda vez comprobará que la
//    instancia existe y se cerrará. Cuando cerremos la app
//    principal hay que borrar la instancia para permitir
//    la siguiente ejecución de la app.
      
    
    private final String F_BLOQUEO = "instancia.lock";
    private IGU igu;
    GEV (IGU igu){
    this.igu = igu;
    }
    
    // MÉTODOS QUE VAMOS A IMPLEMENTAR:
    
    @Override
    public void windowOpened (WindowEvent we){ //cuando la ventana se crea
    // Siempre que actuemos con ficheros try/catch para evitar errores    
        try{
            activarInstancia();
        }catch (Exception e){
            cerrarPrograma();
        }
    }
    
    
    
    @Override
    public void windowClosing (WindowEvent we){ //cuando le damos a la x, justo antes de cerrarse
        try{
            desactivarInstancia();
        }catch (Exception e) {
            cerrarPrograma ();
        }
    }
    
    private void cerrarPrograma(){
        // SECUÉNCIA PARA SALIR DE UNA APP GRÁFICA:
        igu.setVisible (false);//1º hacemos desaparecer el interfaz para evitar que queden zonas bloqueadas y visibles
        igu.dispose();//2º obigamos al interfaz a devolver todos los recursos que utiliza.
        System.exit (0);// 3º cerramos la app, elimina el hilo de ejecución del main, el cero le dice al SO "todo ha ido bien"
    }
    
    private void  activarInstancia () throws Exception{
        File f = new File (F_BLOQUEO);//F_BLOQUEO es la ruta en la que vamos a buscar/escribir/borrar
        // el objeto f nos parmite acceder a los métodos de File
        
        boolean existeOK = f.exists();//exists nos dice si el fichero existe o no.
        
        if (!existeOK){ // si no existe creamos la instancia
            f.createNewFile();//creamos el fichero en la ruta dada por F_BLOQUEO.
        }else {
            throw new Exception ("Ya hay otra instancia");
        }
    }
    
    private void desactivarInstancia() throws Exception {
        File f = new File (F_BLOQUEO);
        
        boolean existeOK = f.exists(); // comprobamos si existe el fichero
       
        if (existeOK){ // si existe lo borramos para permitir la proxima ejecución.
            f.delete();//borramos el fichero en la ruta dada por F_BLOQUEO.
        }else {
            throw new Exception ("Problemas con la anulación");
        }
    }
}
